`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/07/11 10:20:18
// Design Name: 
// Module Name: execute
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module execute( // 执行模块
    input EXE_valid,    // 执行机有效信号
    input [149:0] ID_EXE_bus_r, // ID -> EXE
    output EXE_over,    // 执行完毕
    output [105:0] EXE_MEM_bus,     // EXE -> MEM
    output [31:0] EXE_pc    // 展示PC
    );
    
    // ALU 参数
    wire [11:0] alu_control;
    wire [31:0] alu_op1;
    wire [31:0] alu_op2;
    
    // 访存需要的参数
    wire [3:0] mem_control; // MEM 控制信号
    wire [31:0] store_data; // store 操作的存的数据
    
    // 写回需要的参数
    wire rf_wen;
    wire [4:0] rf_wdest;
    
    wire [31:0] pc;
    assign {
        alu_control,
        alu_op1,
        alu_op2,
        mem_control,
        store_data,
        rf_wen,
        rf_wdest,
        pc} = ID_EXE_bus_r;
    
    wire [31:0] alu_result;
    alu alu_module(
        .control (alu_control),
        .op1 (alu_op1),
        .op2 (alu_op2),
        .result (alu_result)
    );
    
    // 执行完成
    assign EXE_over = EXE_valid;
    
    // 写回数据
    assign EXE_MEM_bus = {mem_control, store_data,
            alu_result,
            rf_wen, rf_wdest,
            pc};
    
    // 展示PC
    assign EXE_pc = pc;
    
endmodule
